En este capítulo veremos algunas otras funciones “más avanzadas” de gt. Para utilizar dichas funciones es necesario tener algunos conocimiento de HTML, CSS, entre otros.
4.1 Personalización con CSS
El paquete gt tiene la función opt_css que nos permite personalizar la tabla aplicando nuestro propio CSS. Para visualizar esto, vamos a crear una tabla usando la base de datos exibble disponible en R, modificaremos el color de fondo de la tabla (one .gt_table {background-color:}), el espacio de cada para fila de la gráfica (#one .gt_row {padding:}), haremos que los títulos de las columnas se vean centrados (#one .gt_col_heading {text-align:}) y también que cambie el color de fondo de una fila cuando pongamos el mouse sobre ella (#one tr:hover {background-color:})
¡Quedó preciosa nuestra tabla! Puedes encontrar más opciones de CSS aquí.
4.2 Insertar URLs
Utilizando lenguaje HTML podemos agregar URLs en nuestra tabla. Para ilustrarlo, vamos a crear una una tabla con tres sitios web y sus respectivas direcciones.
library(htmltools)# Primero creamos la base de datos con los sitios y las direccionesex_sites <-data.frame( Dirección =c("https://gmail.com", "https://youtube.com", "https://es.duolingo.com/"),Sitio =c("Gmail", "YouTube", "Duolingo"))# Ahora si creamos la tablagt(ex_sites) %>%text_transform(locations =cells_body(columns =vars(Dirección)), # Comenzamos editando la columna con las direccionesfn =function(x) {# la función map de purrr aplica una operación a cada elemento de x purrr::map(x, ~htmltools::tags$a(href = .x, target ="_blank", .x)) } ) %>%# EXPLICAR ESTOtext_transform(locations =cells_body(columns =vars(Sitio)),fn =function(x) { purrr::map2(.x = x, .y = ex_sites$Dirección, .f =~glue::glue('<a href="{.y}" target="_blank">{.x}</a>')) } )
Podemos agregar opciones para que quien vea nuestra tabla tenga la opción de descargar los datos, esto es posible usando funciones de HTML y agregando una nota al pie de página con la función tab_source_note() de gt. Para ilustrarlo, vamos a presentar en una tabla los datos de mtcars dsiponibles en R; inicialmente crearemos un archivo .csv con la función write.csv2, luego usamos lenguaje HTML para crear un hipervínculo que descarge el archivo .csv, y finalmente agregamos dicho link como una nota al pie de página en la tabla.
También existe una manera más sencilla (sin utilizar lenguaje HTML) para agregar la opción de descargar los datos, solo necesitamos la librería “downloadthis”, veamos cómo, haciendo uso de nuestro ejemplo con mtcars.
library(downloadthis)head(mtcars) %>%gt() %>%tab_source_note( mtcars %>%download_this(output_name ="mtcars", # Cómo se llamará el archivo una vez descargado output_extension =".csv", # El archivo es . csv, también puede ser .xlsxbutton_label ="Download csv", # Cómo se llamará el botónbutton_type ="default", # Tipo de botón, gtambién puede ser danger, warning, etc ) )
mpg
cyl
disp
hp
drat
wt
qsec
vs
am
gear
carb
21.0
6
160
110
3.90
2.620
16.46
0
1
4
4
21.0
6
160
110
3.90
2.875
17.02
0
1
4
4
22.8
4
108
93
3.85
2.320
18.61
1
1
4
1
21.4
6
258
110
3.08
3.215
19.44
1
0
3
1
18.7
8
360
175
3.15
3.440
17.02
0
0
3
2
18.1
6
225
105
2.76
3.460
20.22
1
0
3
1
Con la función download_this podemos personalizar más nuestro botón utilizando lenguaje CSS. Vamos a generar un botón que descargue un archivo .xlsx, de color rojo, letra de tipo “Serif” y borde color negro.
Para personalizar aún más nuestro botón o en general la opción para descargar los datos, puedes explorar Introduction to downloadthis
4.4 Gráficos Sparkline
Los sparklines son gráficos muy pequeños que generalmente se dibujan sin ejes ni coordenadas, se usan para presentar la variación a lo largo del tiempo de cierta medida como la temperatura o algún precio. Crearemos una tabla que muestre un sparkline de drat (Rear axle ratio) para cada cyl (Number od cylinders), para ello, haremos uso de la función text_transform() donde indicaremos que se trata de un gráfico y modificaremos ciertos aspectos como los límites de los ejes.
Un tooltip es una herramienta que de ayuda visual que funciona al posar el cursor sobre algún elemento gráfico y se encarga de informar al usuario respecto a dicho elemento. Inicialmente crearemos una función que genere el tooltip usando lenguaje HTML, y para agregar esta super herramienta a la tabla, vamos a modificar el nombre de las columnas con las funciones cols_label() y html(), ambas de gt.
Y ahora, es momento de agregar íconos. En R, existe el paquete fontawesome que, junto con la función fa(), permiten agregar uno o más íconos Font Awesome. Para adicionarlos en nuestra tabla, nuevamente usaremos la función text_transform() de gt, ubicamos la columna cyl con la función cells_body y ahora sí usamos lenguaje HTML y la función fa() para que aparezcan los camiones (truck,truck-pickup,truck-monster).
No solo puedes agregar carros a tus tablas, puedes agregar cualquier ícono de Font Awesome que esté aquí.
También es posible incluir no solo uno sino varios íconos en la tabla, esto puede ser útil en algunos contextos, por ejemplo, para calificar ciertas cosas. A nuestro ejemplo en Sección 4.3, vamos a agregarle un rating con estrellas, para ello crearemos una función, rating_stars(), que se encarga de colorear las estrellas dependiendo del rating.
Las etiquetas también resultan particularmente útiles en muchos contextos, permiten identificar rápidamente alguna característica que es de nuestro interés. Para incluirlas en nuestra tabla, no es necesario utilizar una función de gt, simplemente agregamos una nueva columna “cylinder” con la función add_cyl_color que hemos creado previamente.
Una sección expandible nos ayuda ahorrando mucho espacio, además, ahí podemos incluir información extra respecto a la tabla. Nuevamente, crearemos un objeto llamado “source_details” que lleva la información de la sección con lenguaje HTML, luego usamos tab_source_note(), una función de gt de la cuál puedes saber más en Sección 2.2.
Antes, en Sección 4.4, vimos cómo incluir un sparkline a una tabla, ahora, agregaremos cualquier gráfico que sea creado con el paquete ggplot2. Cambiamos un poco de ejemplo, utilizamos los datos “penguins” disponibles en el paquete palmerpenguins, haremos una tabla para mostrar diferentes características de los pesos de los pinguinos según su especie, dentro de las características incluiremos un gráfico de violín.
suppressMessages(library(palmerpenguins))suppressMessages(library(ggplot2))suppressMessages(library(purrr))# Cargamos los datosfiltered_penguins <- palmerpenguins::penguins |>filter(!is.na(sex))# Agrupamos por especiepenguin_weights <- filtered_penguins |>group_by(species) |>summarise(Min =min(body_mass_g),Mean =mean(body_mass_g) |>round(digits =2),Max =max(body_mass_g) ) |>mutate(species =as.character(species)) |>rename(Species = species)# Función para realizar los gráficos de violínplot_density_species <-function(my_species) { full_range <- filtered_penguins |>pull(body_mass_g) |>range() filtered_penguins |>filter(species == my_species) |>ggplot(aes(x = body_mass_g, y = species)) +geom_violin(fill ='dodgerblue4') +theme_minimal() +scale_y_discrete(breaks =NULL) +scale_x_continuous(breaks =NULL) +labs(x =element_blank(), y =element_blank()) +coord_cartesian(xlim = full_range)}# Tabla con gtpenguin_weights |>mutate(Distribution = Species) |>gt() |>tab_spanner(label ='Penguin\'s Weight',columns =-Species ) |>text_transform(locations =cells_body(columns ='Distribution'),fn =function(column) {map(column, plot_density_species) |>ggplot_image(height =px(50), aspect_ratio =3) } )
Species
Penguin's Weight
Min
Mean
Max
Distribution
Adelie
2850
3706.16
4775
Chinstrap
2700
3733.09
4800
Gentoo
3950
5092.44
6300
Puedes consultar otro tipo de gráficos aquí para agregarlos a tu tabla.
4.10 Agregar imágenes
Y como cereza del pastel, terminaremos este capítulo agregando imágenes. Inicialmente. crearemos un objeto tribble con el nombre y la fotografía de cuatro escritores colombianos muy famosos. Para incluir estas imagenes, basta con ustilizar la función gt_img_rows del paquete gtExtras.
Puedes personalizar aún más la visualización de las imágenes, puedes usar la función gt_img_circle, también de gtExtras, para que las fotografías queden redondeadas.